﻿#!/bin/bash
# ============================================================================
# distcc 分布式编译监控脚本
# ============================================================================
#
# 功能：实时显示分布式编译状态和动态负载均衡信息
#
# 使用方法：
#   ./ci/monitor-distcc.sh
#
# ============================================================================

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
RED='\033[0;31m'
BLUE='\033[0;34m'
BOLD='\033[1m'
NC='\033[0m'

# 查找最新的动态负载信息文件
find_balance_info_file() {
    # 查找最近创建的 distcc_balance_info 文件
    local latest_file=$(ls -t /tmp/distcc_balance_info_*.txt 2>/dev/null | head -n1)
    if [ -n "$latest_file" ]; then
        echo "$latest_file"
    else
        echo ""
    fi
}

# 主监控循环
main() {
    # 检查 distccmon-text 是否可用
    if ! command -v distccmon-text &> /dev/null; then
        echo -e "${RED}[ERROR]${NC} distccmon-text 未安装"
        echo ""
        echo "安装方法："
        echo "  Ubuntu: sudo apt-get install distcc"
        echo "  CentOS: sudo yum install distcc"
        exit 1
    fi

    echo -e "${CYAN}启动分布式编译监控...${NC}"
    echo ""
    sleep 1

    while true; do
        clear

        # 查找并读取动态负载信息
        local balance_info_file=$(find_balance_info_file)

        BALANCE_ENABLED="no"
        LAST_UPDATE=""
        TOTAL_JOBS="${DISTCC_JOBS:-}"
        TOTAL_JOBS_DIFF=""
        HOSTS="${DISTCC_HOSTS:-}"
        HOST_STATUS=""

        # 优先从动态负载信息文件读取
        if [ -n "$balance_info_file" ] && [ -f "$balance_info_file" ]; then
            source "$balance_info_file" 2>/dev/null || true
            # 调试：记录读取的信息（取消注释以启用调试）
            # echo "[DEBUG] 读取: $balance_info_file" > /tmp/monitor_distcc_debug.log
            # echo "[DEBUG] BALANCE_ENABLED=${BALANCE_ENABLED}" >> /tmp/monitor_distcc_debug.log
            # echo "[DEBUG] TOTAL_JOBS=${TOTAL_JOBS}" >> /tmp/monitor_distcc_debug.log
            # echo "[DEBUG] HOST_STATUS=${HOST_STATUS}" >> /tmp/monitor_distcc_debug.log
        fi
        
        # 如果仍然没有获取到，尝试从配置文件读取
        if [ -z "$TOTAL_JOBS" ] || [ -z "$HOSTS" ]; then
            if [ -f "ci/distcc.conf" ]; then
                source ci/distcc.conf 2>/dev/null || true
                TOTAL_JOBS="${DISTCC_JOBS:-}"
                HOSTS="${DISTCC_HOSTS:-}"
                # 如果配置文件中启用了动态均衡，也读取这个设置
                if [ "${DISTCC_DYNAMIC_BALANCE:-no}" = "yes" ] && [ -z "$BALANCE_ENABLED" ]; then
                    BALANCE_ENABLED="yes"
                fi
            fi
        fi
        
        # 如果还是没有，设置为"未知"
        TOTAL_JOBS="${TOTAL_JOBS:-未知}"
        HOSTS="${HOSTS:-未知}"

        # 标题栏（集成动态负载均衡状态和 JOBS 变化）
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        if [ "${BALANCE_ENABLED}" = "yes" ]; then
            echo -e "${CYAN}📊 分布式编译监控 | $(date '+%H:%M:%S') | ${GREEN}🔄 动态均衡: ON${NC} | 更新: ${LAST_UPDATE:-等待中}${NC}"
        else
            echo -e "${CYAN}📊 分布式编译监控 | $(date '+%H:%M:%S')${NC}"
        fi
        
        # 显示 JOBS（始终带变化量）和主机列表（带各主机变化）
        local jobs_display="JOBS=${TOTAL_JOBS}"
        if [ "${BALANCE_ENABLED}" = "yes" ]; then
            # 动态均衡启用时，始终显示变化量（包括+0）
            local diff_value="${TOTAL_JOBS_DIFF:-0}"
            if [ "$diff_value" -gt 0 ] 2>/dev/null; then
                jobs_display="${GREEN}JOBS=${TOTAL_JOBS}(+${diff_value})${NC}"
            elif [ "$diff_value" -lt 0 ] 2>/dev/null; then
                jobs_display="${YELLOW}JOBS=${TOTAL_JOBS}(${diff_value})${NC}"
            else
                jobs_display="${CYAN}JOBS=${TOTAL_JOBS}(+0)${NC}"
            fi
        fi
        echo -e "${BLUE}${jobs_display} | HOSTS=${HOSTS}${NC}"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo ""

        # 如果启用了动态负载均衡，显示主机负载状态和 JOBS 调整
        if [ "${BALANCE_ENABLED}" = "yes" ]; then
            if [ -n "${HOST_STATUS:-}" ]; then
                echo -e "${BOLD}${BLUE}📊 远程编译机 JOBS 状态 & CPU 使用率${NC}"
                echo -e "${HOST_STATUS}"
                echo ""
            else
                # 动态均衡已启用，但还没有状态信息（可能刚开始）
                echo -e "${YELLOW}⏳ 动态均衡已启用，等待首次更新...${NC}"
                echo ""
            fi
        fi

        # 显示编译任务
        echo -e "${BOLD}${BLUE}🔨 编译任务${NC}"

        # 尝试获取编译任务信息
        local distcc_output=$(distccmon-text 2>/dev/null | head -15)

        if [ -n "$distcc_output" ]; then
            echo "$distcc_output"
        else
            echo "  等待编译任务..."
            echo ""
            if [ -z "$balance_info_file" ]; then
                echo -e "  ${CYAN}💡 提示:${NC}"
                echo "  - 确保 DISTCC_DIR 环境变量已设置"
                echo "  - 确保有活动的 distcc 编译任务"
                echo "  - 运行编译命令: ./ci/build.sh debug"
            fi
        fi

        echo ""
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo -e "${YELLOW}💡 编译日志在另一个窗口 | 按 Ctrl+C 退出监控${NC}"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

        sleep 2
    done
}

# 捕获 Ctrl+C，优雅退出
trap 'echo ""; echo "监控已停止"; exit 0' INT TERM

# 执行主函数
main

